package utils

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/base64"
	"errors"
	"io"
	"kugo/log"
)

const secretKey = "httpSecretKey168"

// 加密令牌
func EncryptToken(token string) string {
	plaintext := []byte(token)
	key := []byte(secretKey)

	// 创建AES加密器
	block, err := aes.NewCipher(key)
	if err != nil {
		return ""
	}

	// 创建GCM模式的加密器
	aesgcm, err := cipher.NewGCM(block)
	if err != nil {
		return ""
	}

	// 生成随机的Nonce
	nonce := GenerateNonce(aesgcm.NonceSize())

	// 提供空的AAD参数
	aad := []byte("")

	// 使用AES-GCM进行加密
	ciphertext := aesgcm.Seal(nil, nonce, plaintext, aad)

	// 返回Base64编码的加密结果
	return base64.StdEncoding.EncodeToString(append(nonce, ciphertext...))

}

// 解密令牌
func DecryptToken(encryptedToken string) (string, error) {
	ciphertext, err := base64.StdEncoding.DecodeString(encryptedToken)
	if err != nil {
		return "", err
	}

	key := []byte(secretKey)

	// 创建AES解密器
	block, err := aes.NewCipher(key)
	if err != nil {
		return "", err
	}

	// 创建GCM模式的解密器
	aesgcm, err := cipher.NewGCM(block)
	if err != nil {
		return "", err
	}

	// 获取Nonce大小
	nonceSize := aesgcm.NonceSize()
	if len(ciphertext) < nonceSize {
		return "", errors.New("invalid ciphertext")
	}

	// 提取Nonce和密文
	nonce := ciphertext[:nonceSize]
	encryptedText := ciphertext[nonceSize:]

	// 解密数据
	plaintext, err := aesgcm.Open(nil, nonce, encryptedText, nil)
	if err != nil {
		return "", err
	}

	// 返回解密结果
	return string(plaintext), nil
}

func GenerateNonce(size int) []byte {
	nonce := make([]byte, size)
	if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
		log.ErrLog("生成随机Nonce失败：%s", err.Error())
	}
	return nonce
}
